Amazon SNS で HTTP/S エンドポイントをサブスクライブしてみた
はじめに
アノテーション株式会社の hato です。
Amazon SNS では HTTP または HTTPS エンドポイントにメッセージを送信できますが、実際に設定したことはなかったのでやってみました。
HTTP/S エンドポイントへのファンアウト - Amazon Simple Notification Service
Amazon SNS を使用して、1 つ以上の HTTP または HTTPS エンドポイントに通知メッセージを送信できます。
HTTP/S エンドポイントについて
- HTTP もしくは HTTPS が選択できます。
- メッセージは POST リクエストで送信されます。
- サブスクライブを行うと、確認のため
SubscribeURL
が含まれるリクエストが SNS から送信されるのでSubscribeURL
にアクセスする必要があります。SubscribeURL
の確認ができ次第、メッセージが送信されるようになります。
{ "Type" : "SubscriptionConfirmation", "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b", "Token" : "2336412f37f...", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.", "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37...", "Timestamp" : "2012-04-26T20:45:04.751Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEpH+...", "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem" }
やってみた
前提
- SNS トピックは作成済
- メッセージ受信用にパブリックサブネットに EC2 を作成済
構成図
手順
- メッセージ受信用のアプリケーション作成
- エンドポイントのサブスクライブ
- メッセージの通知確認
メッセージ受信用のアプリケーション作成
EC2 に Python で簡単な HTTP ウェブサーバを起動します。
※ 80 ポートへの POST リクエストを標準出力に表示するサンプルコードです。何も表示されませんが、そのままで次の手順を実行してください。
参考:デバッグ用HTTP ServerをPythonで起動する | エンジニアっぽいことを書くブログ
$ python -c "import BaseHTTPServer class Handle(BaseHTTPServer.BaseHTTPRequestHandler): def do_POST(self): content_len = int(self.headers.getheader('content-length', 0)) post_body = self.rfile.read(content_len) print(post_body) self.send_response(200) BaseHTTPServer.HTTPServer(('', 80), Handle).serve_forever()"
エンドポイントのサブスクライブ
Amazon SNS コンソール のナビゲーションペインから「サブスクリプションの作成」を選択します。
次の値を指定して「サブスクリプションの作成」を選択します。
- トピック ARN:関連付けを行う SNS トピックを選択
- プロトコル:
HTTP
- エンドポイント:任意の URL(例:EC2 の IP アドレス)
サブスクリプションが正常に作成されたことを確認します。
エンドポイント(EC2) を確認すると、SubscribeURL
を含むリクエストを受信しているので、SubscribeURL
をクリックボードにコピーします。
$ python -c "import BaseHTTPServer class Handle(BaseHTTPServer.BaseHTTPRequestHandler): def do_POST(self): content_len = int(self.headers.getheader('content-length', 0)) post_body = self.rfile.read(content_len) print(post_body) self.send_response(200) BaseHTTPServer.HTTPServer(('', 80), Handle).serve_forever()" { "Type" : "SubscriptionConfirmation", "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b", "Token" : "2336412f37f...", "TopicArn" : "arn:aws:sns:ap-northeast-1:123456789012:hato-sns-topic", "Message" : "You have chosen to subscribe to the topic arn:aws:sns:ap-northeast-1:123456789012:hato-sns-topic.\nTo confirm the subscription, visit the SubscribeURL included in this message.", "SubscribeURL" : "https://sns.ap-northeast-1.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:ap-northeast-1:123456789012:hato-sns-topic&Token=2336412f37f...", "Timestamp" : "2012-04-26T20:45:04.751Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEpH+...", "SigningCertURL" : "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem" } 54.240.200.6 - - [01/Nov/2022 01:01:01] "POST / HTTP/1.1" 200 -
SubscribeURL
にブラウザでアクセスして、エンドポイントを確認します。
ステータスが「確認済み」になることを確認します。
メッセージの通知確認
「メッセージの発行」を選択します。
テストメッセージを入力して「メッセージの発行」を選択します。
エンドポイントにメッセージが配信されました。
$ python -c "import BaseHTTPServer class Handle(BaseHTTPServer.BaseHTTPRequestHandler): def do_POST(self): content_len = int(self.headers.getheader('content-length', 0)) post_body = self.rfile.read(content_len) print(post_body) self.send_response(200) BaseHTTPServer.HTTPServer(('', 80), Handle).serve_forever()" { "Type" : "Notification", "MessageId" : "22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324", "TopicArn" : "arn:aws:sns:ap-northeast-1:123456789012:hato-sns-topic", "Subject" : "hato-test-title", "Message" : "hato-test-Message", "Timestamp" : "2012-05-02T00:54:06.655Z", "SignatureVersion" : "1", "Signature" : "EXAMPLEw6JRN...", "SigningCertURL" : "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem", "UnsubscribeURL" : "https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-northeast-1:123456789012:hato-sns-topic:d6a4f408-4021-4e66-82e3-920cb71bb5fe" }
最後に
この記事が誰かのお役にたてば幸いです。
参考資料
- Amazon SNS とは - Amazon Simple Notification Service
- HTTP/S エンドポイントへのファンアウト - Amazon Simple Notification Service
- AWS SDK を使用して、HTTP エンドポイントを Amazon SNS トピックにサブスクライブする - Amazon Simple Notification Service
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。